"""
https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/

19. 删除链表的倒数第 N 个结点
已解答
中等
相关标签
premium lock icon
相关企业
提示
给你一个链表，删除链表的倒数第 n 个结点，并且返回链表的头结点。

 

示例 1：


输入：head = [1,2,3,4,5], n = 2
输出：[1,2,3,5]
示例 2：

输入：head = [1], n = 1
输出：[]
示例 3：

输入：head = [1,2], n = 1
输出：[1]
 

提示：

链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
 

进阶：你能尝试使用一趟扫描实现吗？
"""

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
from typing import Optional
from list_node import ListNode


class Solution:
    """
    要一趟扫描，仅需提供两个同步跑的节点。
    较快的那个提前走上n步即可。
    """
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        root=ListNode(0,head)
        slow=fast=root
        for i in range(n):
            fast=fast.next

        while fast.next:
            fast=fast.next
            slow=slow.next
        
        slow.next=slow.next.next

        return root.next